FWK.extend(FWK,{
	/* 创建Dom缓存 */
	_cashe:{},
	/* Element 属性赋值 非IE 向IE 规则靠拢 */
	_names:{"className":"class"},
	/**
	 * 创建单个Dom 有缓存机制 返回创建好的 Dom
	 * @param {String} _tagName tagname
	 * @param {Object} _attributes 属性对象 集体
	 * @param {String} _text 插入Text
	 * @param {Boolen} _flag 创建的Dom对象是否要获取FWK.Element中的方法
	 */
	createElement:function(tag, attributes, text,arr,flag) {
		if(attributes===undefined && text===undefined){
			return 	document.createTextNode(tag);
		}
		attributes = attributes || {};
		tag = tag.toLowerCase();
		if (FWK.isIE && (attributes.name || attributes.checked)) {
			tag = '<' + tag;
			if (attributes.name) {
				tag = tag + ' name="' + attributes.name + '"';
				delete attributes.name;
			}
			if (attributes.checked) {
				tag = tag + ' checked="checked"';
				delete attributes.name;
			}
			tag = tag + " >";
			var element = document.createElement(tag);
		}
		else {
			if (!this._cashe[tag]) {
				this._cashe[tag] = document.createElement(tag);
			}
			var element = this._cashe[tag].cloneNode(false);

			if(text && !FWK.isArr(text)){
				element.innerHTML = text.toString();
			}
		}
		if(flag){
			FWK.extend(element,FWK.Element,_flag);
		}
		if(FWK.isArr(arr)){
			arr.push(element);
		}
		FWK.Element.setAtt.call(element,attributes);
		return element;
	},
	/**
	 * 创建有结构的Dom 有缓存机制 返回创建好的 Dom
	 * @param {Array}	tags
	 * @param {Boolen} _flag 创建的Dom对象是否要获取FWK.Element中的方法
	 * 如：["div",{className:"class1"},["div",{className:"a1"},[["div",{className:"class2"},"class2"],["div",{className:"class3"},"class3"]]]]
	 * 就能创建：
	 * <div class="class1">							1
	 * 		<div class="a1">						2
	 * 			<div class="class2">class2</div>	3
	 * 			<div class="class1">class1</div>	4
	 * 		</div>
	 * </div>
	 * 高级使用：分组
	 * a是一个空数组，b也是一个空数组 以及是否需要获得FWF.Element方法的引用
	 * ["div",{className:"class1"},["div",{className:"a1"},[["div",{className:"class2"},"class2",true],["div",{className:"class3"},"class3",b]],b],a,true]
	 * 执行完后 	a = [1]
	 * 			b = [2,4]
	 */
	createXElement : function(tags) {
		if(FWK.isStr(tags[0])){
			var element = FWK.createElement(tags[0],tags[1],tags[2],tags[3],tags[4]);
			if(FWK.isArr(tags[2])){
				FWK.Element.addChild.call(element,FWK.createXElement(tags[2]));
			}
			return element;
		}
		else if(FWK.isArr(tags[0])){
			var els = [];
			for(var i=0,ilen=tags.length;i<ilen;i+=1){
				els.push(FWK.createXElement(tags[i]));
			}
			return els;
		}
	},
	/**
	 * 获取页面Dom对象
	 * @param {Array | Object | Str | Dom}	_arg
	 * @param {Boolen} _flag 获取的Dom 和 [Dom] 对象（集）是否要获取FWK.Element或FWK.Elements中的方法
	 * 如：FWK.elementQuery("a",true);			返回id为a的Dom Dom上会绑定所有FWK.Element的方法
	 * 如：FWK.elementQuery("a");				返回id为a的Dom Dom上不会会绑定所有FWK.Element的方法
	 * 如：FWK.elementQuery(["a","b"],true);		返回数组：[a,b]a和b为Dom对象，并a和b绑定 FWK.Element的所有方法 并且 [a,b]上绑定所有FWK.Elements的方法
	 * 如：FWK.elementQuery(["a","b"]);			返回数组：[a,b]a和b为Dom对象 没有任何绑定
	 * 如：FWK.elementQuery({a:"a",b:"b"});		返回Object对象，{a:a,b:b} a和b为Dom对象,并a和b绑定 FWK.Element的所有方法 并且 {a:a,b:b}上绑定所有FWK.Elements的方法
	 * 如：FWK.elementQuery({a:"a",b:"b"});		返回Object对象，没有任何绑定
	 * 如：FWK.elementQuery(a,true);				其中a为Dom对象，返回a，a上会绑定所有FWK.Element的方法
	 * 如：FWK.elementQuery(a);					其中a为Dom对象，没有任何绑定
	 */
	elementQuery : function(_arg,_flag){
		if(FWK.isArr(_arg)){
			var els = [];
			for(var i=0,ilen=_arg.length;i<ilen;i+=1){
				if (FWK.isStr(_arg[i])) {
					var element = $(_arg[i]);
					if(element && _flag){
						FWK.extend(element,FWK.Element,_flag);
						els.push(element);
					}
					else{
						els.push(element);
					}
				}
				else{
					els.push(element);
				}
			}
			if(_flag)FWK.extend(els,FWK.Elements,_flag);
			return els;
		}
		else if(FWK.isObj(_arg)){
			var els = {};
			for(var n in _arg){
				if(FWK.isStr(_arg[n])){
					var element = document.getElementById(_arg[n]);
					if (element && _flag) {
						FWK.extend(element,FWK.Element,_flag);
						els.push(element);
					}
					else{
						els[n] = element;
					}

				}
				else{
					els[n] = element;
				}
			}
			if(_flag)FWK.extend(els,FWK.Elements,_flag);
			return els;
		}
		else if(FWK.isStr(_arg)){
			var element = document.getElementById(_arg);
			if(element && _flag){
				FWK.extend(element,FWK.Element,_flag);
				return element;
			}
			else{
				return element;
			}
		}
		else if(FWK.isEl(_arg)){
			if(_flag){
				FWK.extend(_arg,FWK.Element,_flag);
			}
			return _arg;
		}
	}
});

/**
 * 创建Element对象
 * Element 方法中的this一定要指向一个Dom对象 而不是Element对象
 * 可以用 FWK.extend(Dom,FWK.Element) 来对Dom 添加Element方法的引用，这样就能这样用：Dom.setAtt()
 */
FWK.Element = {
	/**
	 * 设置节点属性
	 * @param {Object | String} _name
	 * @param {String} _value 				当_name为String的时候，才需要这个_value
	 * 如：{className:"class1"} 将Dom的className设置为 class1
	 * 如："className"，"class1" 将Dom的className设置为 class1
	 */
	setAtt:function(_name,_value) {
		var attributes = {};
		if(FWK.isObj(_name)) {
			attributes = _name;
		}
		else{
			attributes[_name] = _value;
		}
		for (var attr in attributes) {
			if(attr=="style"){
				for(var style in attributes[attr]){
					this.style[style] = attributes[attr][style];
				}
				continue;
			}
			var aname = (!FWK.isIE)?FWK.createElementNames[attr] || attr:attr, value = attributes[attr];
			if(FWK.isFun(value)){
				this[aname] = value;
			}
			else if(value === false || value === null || value===undefined) {
				this.removeAttribute(aname);
			}
			else if(value === true) {
				this.setAttribute(aname, aname);
			}
			else{
				this.setAttribute(aname, value);
			}
		}
	},
	/**
	 * 删除一个或多个Dom属性节点
	 * @param {Array|String} _atts
	 */
	removeAtt:function(_atts){
		if(FWK.isStr(_atts)){
			this.removeAttribute(_atts);
		}
		else if(FWK.isArr(_atts)){
			for(var i=0,ilen=_atts.length;i<ilen;i+=1){
				this.removeAttribute(_atts[i]);
			}
		}
	},
	/**
	 * 清楚所有Dom下的子节点
	 */
	clearChild:function(){
		while(this.childNodes.length){
			this.removeChild(this.lastChild);
		}
	},
	/**
	 * 同setAtt类似 只是这个设置的是样式
	 * @param {Object} _styles
	 * 如：{display:"none"} 将Dom的style.display设置为 none
	 */
	setStyle:function(_styles){
		if(!FWK.isObj(_styles))return;
		for(var n in _styles){
			if(!(FWK.isStr(_styles[n])) || FWK.isNum(_styles[n]))continue;
			this.style[n] = _styles[n];
		}
	},
	/**
	 * 获得 Dom的宽 高 上坐标和左坐标
	 * @return {
			left: left,			//左
			top: top,			//右
			width: width,		//宽
			height: height		//高
		}
	 */
	getCoord:function(){
		return FWK.getDomCoord(this);
	},
	/**
	 * 增加子节点
	 * @param {Dom | Array} _el		_el为Dom或者Dom组成的数组
	 * 会把_el加入到 Dom 中
	 */
	addChild : function(_el){
		if(FWK.isET(_el)){
			this.appendChild(_el);
		}
		else if(FWK.isArr(_el) || FWK.isObj(_el)){
			for(var n in _el){
				try{this.appendChild(_el[n])}catch(e){};
			}
		}
	},
	/**
	 * 为Dom增加事件
	 * @param {String} _sEventType
	 * @param {Function} _fnHandler
	 * 例如：FWK.Element.addEvent.call(Dom,'click',function(){});
	 * IE中 事件前面的on统一去除 兼容Firefox
	 */
	addEvent:function(_sEventType, _fnHandler){
		FWK.addEvent(this,_sEventType, _fnHandler);
	},
	/**
	 * 为Dom移除事件
	 * @param {String} _sEventType
	 * @param {Function} _fnHandler
	 * 例如：FWK.Element.addEvent.call(Dom,'click',事件引用);
	 * IE中 事件前面的on统一去除 兼容Firefox
	 */
	removeEvent:function(_sEventType, _fnHandler){
		FWK.removeEvent(this,_sEventType, _fnHandler);
	},
	/**
	 *
	 * @param {String} _ot
	 * @param {String} _ov
	 */
	setHover:function(_ot,_ov){
		_ot = _ot || "";
		_ov = _ov || "";
		FWK.Element.addEvent(this,"mouseover",function(){
			if(FWK.isStr(_ov)){
				this.className = _ov;
			}
			else if(FWK.isObj(_ov)){
				FWK.Element.setStyle.call(this,_ov);
			}

		});
		FWK.Element.addEvent(this,"mouseout",function(){
			if(FWK.isStr(_ot)){
				this.className = _ot;
			}
			else if(FWK.isObj(_ot)){
				FWK.Element.setStyle.call(this,_ot);
			}
		});
	},
	/**
	 *把this节点加入目标节点中
	 */
	appendTo:function(dom,num){
		dom = $(dom);
		var childs;
		if(FWK.isNum(num) && num>=0){
			var childs = [];
			for(var i=0;i<dom.childNodes.length;i+=1){
				if(dom.childNodes[i].nodeType==1){
					childs.push(dom.childNodes[i]);
				}
			}
			if(num<childs.length){
				dom.insertBefore(this,childs[num]);
			}
			else{
				dom.appendChild(this);
			}
		}
		else{
			dom.appendChild(this);
		}
	}
}
/**
 * 创建Elements对象
 * Elements 方法中的this一定要指向多个[Dom]对象集 而不是Elements对象
 * 可以用 FWK.extend([Dom],FWK.Elements) 来对[Dom] 添加Elements方法的引用，这样就能这样用：[Dom].setAtt()
 * 效果：为[Dom]集 中每个Dom添加相同的 属性
 */
FWK.Elements = {
	//设置 节点属性
	setAtt:function(_name,_value) {
		for(var n in this){
			if(FWK.isEl(this[n])){
				FWK.Element.setAtt.call(this[n],_name,_value);
			}
		}
	},
	//移除 属性节点
	removeAtt:function(_atts){
		for(var n in this){
			if(FWK.isEl(this[n])){
				FWK.Element.removeAtt.call(this[n],_atts);
			}
		}
	},
	//设置 样式
	setStyle:function(_styles){
		for(var n in this){
			if(FWK.isEl(this[n])){
				FWK.Element.setStyle.call(this[n],_styles);
			}
		}
	},
	//增加事件
	addEvent:function(_sEventType, _fnHandler){
		for(var n in this){
			if(FWK.isEl(this[n])){
				FWK.addEvent(this[n],_sEventType, _fnHandler);
			}
		}
	},
	//移除事件
	removeEvent:function(_sEventType, _fnHandler){
		for(var n in this){
			if(FWK.isEl(this[n])){
				FWK.removeEvent(this[n],_sEventType, _fnHandler);
			}
		}
	},
	setHover:function(_ot,_ov){
		for(var n in this){
			if(FWK.isEl(this[n])){
				FWK.Element.setHover.call(this[n],_ot,_ov);
			}
		}
	},
	//把自己节点群 加入到某个节点中
	appendTo:function(dom,num){
		for(var n in this){
			if(FWK.isET(this[n])){
				FWK.Element.appendTo.call(this[n],dom,num++);
			}
		}
	},
	/**
	 * 有value属性的控件取得value值
	 */
	value:function(){
		if(FWK.isArr(this)){
			var RV = [];
		}
		else{
			var RV = {};
		}
		for(var n in this){
			RV[n] = this[n].value || "";
		}
		return RV;
	}
}